# -*- coding: utf-8 -*-

"""
@File    : output_wave.py
@Author  : Lihuan
@Time    : @2024/9/21 17:14
@Mark    :
"""
from FakerDevice.fakerFPGA.digi_variable import PinType, WaveTable
import pandas as pd


class FakeUnitOutWave:
    """
    10个SYS_CLK Toggle后,
    """

    head = ["SYS_CLK", "OUT0", "OUT1", "TRIGGER", "TIMING_DRIVE"]
    type = [PinType.IN, PinType.OUT, PinType.OUT, PinType.OUT, PinType.IN]
    dataOut1 = [
        [WaveTable.OUTPUT_H, WaveTable.OUTPUT_L] * 100,  # SYS_CLK
        ([WaveTable.OUTPUT_H, WaveTable.OUTPUT_H] * 10) * 10,  # OUT0
        ([WaveTable.OUTPUT_H, WaveTable.OUTPUT_H] * 10) * 10,  # OUT1
        ([WaveTable.OUTPUT_H] + [WaveTable.OUTPUT_L] * 19) * 10,  # TRIGGER -> 配置的周期
        ([WaveTable.OUTPUT_L, WaveTable.OUTPUT_L] * 10) * 10  # TIMING_DRIVE -> 变化点
    ]

    dataOut0 = [
        [WaveTable.OUTPUT_H, WaveTable.OUTPUT_L] * 100,  # SYS_CLK
        ([WaveTable.OUTPUT_L, WaveTable.OUTPUT_L] * 10) * 10,  # OUT0
        ([WaveTable.OUTPUT_H, WaveTable.OUTPUT_H] * 10) * 10,  # OUT1
        ([WaveTable.OUTPUT_H] + [WaveTable.OUTPUT_L] * 19) * 10,
        ([WaveTable.OUTPUT_L, WaveTable.OUTPUT_L] * 10) * 10
    ]

    dataOutX = [
        [WaveTable.OUTPUT_H, WaveTable.OUTPUT_L] * 100,  # SYS_CLK
        ([WaveTable.OUTPUT_H, WaveTable.OUTPUT_H] * 10) * 10,  # OUT0
        ([WaveTable.OUTPUT_L, WaveTable.OUTPUT_L] * 10) * 10,  # OUT1
        ([WaveTable.OUTPUT_H] + [WaveTable.OUTPUT_L] * 19) * 10,
        ([WaveTable.OUTPUT_L] * 10 + [WaveTable.OUTPUT_H] + [WaveTable.OUTPUT_L] * 9) * 10
    ]

    dataOutC = [
        [WaveTable.OUTPUT_H, WaveTable.OUTPUT_L] * 100,  # SYS_CLK
        ([WaveTable.OUTPUT_L] * 10 + [WaveTable.OUTPUT_H] * 20 + [WaveTable.OUTPUT_L] * 10) * 5,
        # C,从低开始, TIMING_DRIVE后反向
        ([WaveTable.OUTPUT_H, WaveTable.OUTPUT_H] * 10) * 10,  # OUT1
        ([WaveTable.OUTPUT_H] + [WaveTable.OUTPUT_L] * 19) * 10,
        ([WaveTable.OUTPUT_L] * 10 + [WaveTable.OUTPUT_H] + [WaveTable.OUTPUT_L] * 9) * 10
    ]

    dataOutC1 = [
        [WaveTable.OUTPUT_H, WaveTable.OUTPUT_L] * 100,  # SYS_CLK
        ([WaveTable.OUTPUT_L] * 5 + [WaveTable.OUTPUT_H] * 10 + [WaveTable.OUTPUT_L] * 5) * 10,
        # C,从低开始, TIMING_DRIVE后反向
        ([WaveTable.OUTPUT_H, WaveTable.OUTPUT_H] * 10) * 10,  # OUT1
        ([WaveTable.OUTPUT_H] + [WaveTable.OUTPUT_L] * 19) * 10,
        ([WaveTable.OUTPUT_L] * 5 + [WaveTable.OUTPUT_H] + [WaveTable.OUTPUT_L] * 4) * 20
    ]

    dataOutK = [
        [WaveTable.OUTPUT_H, WaveTable.OUTPUT_L] * 100,  # SYS_CLK
        ([WaveTable.OUTPUT_H] * 10 + [WaveTable.OUTPUT_L] * 20 + [WaveTable.OUTPUT_H] * 10) * 5,
        # K,从高开始, TIMING_DRIVE后反向
        ([WaveTable.OUTPUT_H, WaveTable.OUTPUT_H] * 10) * 10,  # OUT1
        ([WaveTable.OUTPUT_H] + [WaveTable.OUTPUT_L] * 19) * 10,
        ([WaveTable.OUTPUT_L] * 10 + [WaveTable.OUTPUT_H] + [WaveTable.OUTPUT_L] * 9) * 10
    ]

    @staticmethod
    def getDf(data):
        if not isinstance(data, list):
            raise Exception("not isinstance(data, list)")
        df = pd.DataFrame(data, None).T
        new_name = {}
        for index, each in enumerate(FakeUnitOutWave.head):
            new_name[index] = each
        return df.rename(columns=new_name)

    @staticmethod
    def getPinConfig():
        return dict(zip(FakeUnitOutWave.head, FakeUnitOutWave.type))


def test_print_df():
    print(FakeUnitOutWave.getDf(FakeUnitOutWave.dataOut1))


def test_PinConfig():
    print(FakeUnitOutWave.getPinConfig())
